<?php
        include_once 'xmlrpc.inc';

	class Linea {
		private $linea;
		private $monitorata;
		private $abilitata;
		private $id_news;
		public function __construct($linea, $monitorata, $abilitata, $id_news)
		{
			$this->linea = $linea;
			$this->monitorata = $monitorata;
			$this->abilitata = $abilitata;
			$this->id_news = $id_news;
		}

		public function getLinea() {
			return $this->linea;
		}
		public function isMonitorata() {
			return $this->monitorata;
		}
		public function isAbilitata() {
			return $this->abilitata;
		}
		public function isNews() {
			return $this->id_news;
		}
	}
	
	class Servizi {
		private $meb;
		private $pedana;
		private $moby;
		private $aria_condizionata;
		public function __construct($meb, $pedana, $moby, $aria_condizionata)
		{
			$this->meb = $meb;
			$this->pedana = $pedana;
			$this->moby = $moby;
			$this->aria_condizionata = $aria_condizionata;
		}
	}
	
	class InfoVeicolo {
		private $a_capolinea;
		private $in_arrivo;
		private $tempo_attesa;
		private $distanza_fermate;
		private $carteggi_dec;
		private $capolinea;
		private $annuncio;
		public function __construct($a_capolinea, $in_arrivo, $tempo_attesa, $distanza_fermate, $carteggi_dec, $capolinea, $annuncio)
		{
			$this->a_capolinea = $a_capolinea;
			$this->in_arrivo = $in_arrivo;
			$this->tempo_attesa = $tempo_attesa;
			$this->distanza_fermate = $distanza_fermate;
			$this->carteggi_dec = $carteggi_dec;
			$this->capolinea = $capolinea;
			$this->annuncio = $annuncio;
		}
		
		public function isCapolinea() {
			return $this->a_capolinea;
		}
		
		public function isInArrivo() {
			return $this->in_arrivo;
		}
		
		public function getDistanzaFermate() {
			return $this->distanza_fermate;
		}
		public function getTempoAttesa() {
			return $this->tempo_attesa;
		}
		public function getAnnuncio() {
			return $this->annuncio;
		}
		
	}
	
	class Veicolo {
		private $linea;
		private $id_percorso;
		private $id_veicolo;
		
		private $info_veicolo;
		private $servizi;
		public function __construct($linea, $id_percorso, $id_veicolo, $info_veicolo, $servizi)
		{
			$this->linea = $linea;
			$this->id_percorso = $id_percorso;
			$this->id_veicolo = $id_veicolo;
			$this->info_veicolo = $info_veicolo;
			$this->servizi = $servizi;
		}
	
		public function getLinea() {
			return $this->linea;
		}
		public function getIdPercorso() {
			return $this->id_percorso;
		}
		public function getIdVeicolo() {
			return $this->id_veicolo;
		}
		public function isCapolinea() {
			return $this->info_veicolo->isCapolinea();
		}
		public function isInArrivo() {
			return $this->info_veicolo->isInArrivo();
		}
		public function getStops() {
			return $this->info_veicolo->getDistanzaFermate();
		}
		public function getMinutes() {
			return $this->info_veicolo->getTempoAttesa();
		}
		public function getAnnuncio() {
			return $this->info_veicolo->getAnnuncio();
		}
		
	}


	class Percorso {
		private $id_percorso;
		private $capolinea;

		public function __construct($id_percorso, $capolinea)
		{		
			$this->id_percorso = $id_percorso;
			$this->capolinea = $capolinea;
			
		}

		public function getIdPercorso()
		{
			return $this->id_percorso;
		}
		public function getCapolinea()
		{
			return $this->capolinea;
		}
	}
	
	class Fermata {
		private $id_palina;
		private $nome;
		
		public function __construct($id_palina, $nome)
		{
			$this->id_palina = $id_palina;
			$this->nome = $nome;
		}
		
		public function getIdPalina()
		{
			return $this->id_palina;
		}
		
		public function getNome()
		{
			return $this->nome;
		}
		
	}

	class Paline {
		private $token_id;
		private $url_palina_service;

		public function __construct($token_id) {
			$this->url_palina_service = new xmlrpc_client("http://muovi.roma.it/ws/xml/paline/7");
			$this->token_id = $token_id;
		} 


		/*
		*	Questo metodo restituisce l'elenco dei veicoli in arrivo alla palina id_palina, con le relative informazioni (tempo di attesa, servizi a bordo ecc.)
		*/
		public function getPalinaLinee($palina_id) {
			$veicoli_req = new xmlrpcmsg('paline.PalinaLinee', array( new xmlrpcval($this->token_id, "string"), new xmlrpcval($palina_id, "int" ), new xmlrpcval("italiano", "string")));
			$result = $this->url_palina_service->send($veicoli_req);
			if (!$result->faultCode())
			{
				$value_linee_resp = $result->value();
				$resp = $value_linee_resp->structMem("risposta");
				for ($i = 0; $i < $resp->arraySize(); $i++)
				{
					$val = $resp->arrayMem($i);
					$linee = $val->structMem("linea")->scalarVal();
					$monitorata = $val->structMem("monitorata")->scalarVal();
					$abilitata = $val->structMem("abilitata")->scalarVal();
					$id_news = $val->structMem("id_news")->scalarVal();
					$linea = new Linea($linee, $monitorata, $abilitata, $id_news);
					$listArray[] = $linea;
				}
			}
			else
			{
				throw new Exception("Errore richiesta linee<br/>");
			}
			return $listArray;
		}
		
		public function getProssimaPartenza($id_percorso) {
			$veicoli_req = new xmlrpcmsg('paline.ProssimaPartenza', array( new xmlrpcval($this->token_id, "string"), new xmlrpcval($id_percorso, "string" ), new xmlrpcval("italiano", "string")));
			$result = $this->url_palina_service->send($veicoli_req);
			if (!$result->faultCode())
			{
				$value_linee_resp = $result->value();
				$resp = $value_linee_resp->structMem("risposta");
				$partenza = $resp->scalarVal();
				return $partenza;
			}
			else
			{
				throw new Exception("Errore richiesta Prossima partenza<br/>");
			}
			return $listArray;
		}
		
		public function getPercorsi($linea) {
			$percorsi_req = new xmlrpcmsg('paline.Percorsi', array( new xmlrpcval($this->token_id, "string"), new xmlrpcval($linea, "string"), new xmlrpcval("italiano", "string") ));
			$result = $this->url_palina_service->send($percorsi_req);
			$listPercorsi = array();
			if (!$result->faultCode())
			{
				$value_percorsi_resp = $result->value();
				$resp = $value_percorsi_resp->structMem("risposta");

				$abilitata = $resp->structMem("abilitata")->scalarVal();
				$id_news = $resp->structMem("id_news")->scalarVal();
				$monitorata = $resp->structMem("monitorata")->scalarVal();
				$percorsi = $resp->structMem("percorsi");
	
				for ($i = 0; $i < $percorsi->arraySize(); $i++)
				{
					$elemento = $percorsi->arrayMem($i);
					$id_percorso = $elemento->structMem("id_percorso")->scalarVal();
					$descrizione = $elemento->structMem("descrizione")->scalarVal();
					$capolinea = $elemento->structMem("capolinea")->scalarVal();
					$percorso = new Percorso($id_percorso, $capolinea);
					$listPercorsi[] = $percorso;
				}
			}
			else
			{
				throw new Exception("Errore richiesta Percorsi<br/>");
			}
			return $listPercorsi;
			
		}
		
		public function getVeicoli($palina_id) {
			$veicoli_req = new xmlrpcmsg('paline.Veicoli', array( new xmlrpcval($this->token_id, "string"), new xmlrpcval($palina_id, "int"), new xmlrpcval("italiano", "string") ));
			$result = $this->url_palina_service->send($veicoli_req);
			$listVeicoli = array();
			if ( !$result->faultCode())
			{
				$value_linee_resp = $result->value();
				$resp = $value_linee_resp->structMem("risposta");
				
				$palina_nome = $resp->structMem("nome")->scalarVal();
				$abilitata = $resp->structMem("abilitata")->scalarVal();
				$id_news = $resp->structMem("id_news")->scalarVal();
				$veicoli = $resp->structMem("veicoli");
				// iterating over values of an array object
				for ($i = 0; $i < $veicoli->arraySize(); $i++)
				{
					$element = $veicoli->arrayMem($i);
					$linea = $element->structMem("linea")->scalarVal();
					$id_percorso = $element->structMem("id_percorso")->scalarVal();
					$id_veicolo = $element->structMem("id_veicolo")->scalarVal();
					$carteggi_dec = $element->structMem("carteggi_dec")->scalarVal();
					$capolinea = $element->structMem("capolinea")->scalarVal();
					$annuncio = $element->structMem("annuncio")->scalarVal();
					$meb = $element->structMem("meb")->scalarVal();
					$pedana = $element->structMem("pedana")->scalarVal();
					$moby = $element->structMem("moby")->scalarVal();
					$aria_condizionata = $element->structMem("aria")->scalarVal();
					$a_capolinea = $element->structMem("a_capolinea")->scalarVal();
					$in_arrivo = $element->structMem("in_arrivo")->scalarVal();
					$tempo_attesa = $element->structMem("tempo_attesa")->scalarVal();
					$distanza_fermate = $element->structMem("distanza_fermate")->scalarVal();
					$servizi = new Servizi($meb, $pedana, $moby, $aria_condizionata);
					$info_veicolo = new InfoVeicolo($a_capolinea, $in_arrivo, $tempo_attesa, $distanza_fermate, $carteggi_dec, $capolinea, $annuncio);
					$veicolo = new Veicolo($linea, $id_percorso, $id_veicolo, $info_veicolo, $servizi);
					$this->getProssimaPartenza($id_percorso);
					$listVeicoli[] = $veicolo;
				}
			}
			else
			{
				throw new Exception("Errore richiesta Veicoli<br/>");
			}
			return $listVeicoli;
		}
		
		public function getFermate($id_percorso) {
			$fermate_req = new xmlrpcmsg('paline.Fermate', array( new xmlrpcval($this->token_id, "string"), new xmlrpcval($id_percorso, "string"), new xmlrpcval("italiano", "string") ));
			$result = $this->url_palina_service->send($fermate_req);
			$listFermate = array();
			if (!$result->faultCode())
			{
				$value_fermate_resp = $result->value();
				$resp = $value_fermate_resp->structMem("risposta");
		
				$descrizione = $resp->structMem("descrizione")->scalarVal();
				$capolinea = $resp->structMem("capolinea")->scalarVal();
				$linea = $resp->structMem("linea")->scalarVal();
				$fermate = $resp->structMem("fermate");
		
				for ($i = 0; $i < $fermate->arraySize(); $i++)
				{
					$elemento = $fermate->arrayMem($i);
 					$id_palina = $elemento->structMem("id_palina")->scalarVal();
 					$nome = $elemento->structMem("nome")->scalarVal();
 					$progressiva = $elemento->structMem("progressiva")->scalarVal();
 					$abilitata = $elemento->structMem("abilitata")->scalarVal();
 					//$id_news = $elemento->structMem("id_news")->scalarVal();
 					$fermata = new Fermata($id_palina, $nome);
 					$listFermate[] = $fermata;
				}
			}
			else
			{
			}
			return $listFermate;
				
		}
		
	}
?>
